home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / magix.c < prev    next >
C/C++ Source or Header  |  2000-05-22  |  14KB  |  502 lines

  1. /***************************************************************************
  2.  
  3.                                 -=  Magix  =-
  4.                              (c) 1995  Yun Sung
  5.  
  6.                 driver by    Luca Elia (eliavit@unina.it)
  7.  
  8. CPU : Z80B
  9. SND : Z80A + YM3812 + OKI M5205
  10. OSC : 16.000 MHz
  11.  
  12. Notes:
  13.  
  14. - Title changes to "Rock" via DSW
  15. - In service mode press Service Coin (e.g. '9')
  16.  
  17. To Do:
  18.  
  19. - Better Sound
  20.  
  21. ***************************************************************************/
  22. #include "driver.h"
  23. #include "cpu/z80/z80.h"
  24.  
  25. /* Variables defined in vidhrdw */
  26. extern unsigned char *magix_videoram_0,*magix_videoram_1;
  27.  
  28. /* Functions defined in vidhrdw */
  29.  
  30. WRITE_HANDLER( magix_videobank_w );
  31.  
  32. READ_HANDLER ( magix_videoram_r );
  33. WRITE_HANDLER( magix_videoram_w );
  34.  
  35. WRITE_HANDLER( magix_flipscreen_w );
  36.  
  37. int  magix_vh_start(void);
  38. void magix_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  39.  
  40.  
  41.  
  42. void magix_init_machine( void )
  43. {
  44.     unsigned char *RAM = memory_region(REGION_CPU1) + 0x24000;
  45.  
  46.     magix_videoram_0 = RAM + 0x0000;    // Ram is banked
  47.     magix_videoram_1 = RAM + 0x2000;
  48.     magix_videobank_w(0,0);
  49. }
  50.  
  51.  
  52. /***************************************************************************
  53.  
  54.  
  55.                                 Main CPU
  56.  
  57.  
  58. ***************************************************************************/
  59.  
  60.  
  61. /***************************************************************************
  62.                                     Magix
  63. ***************************************************************************/
  64.  
  65. WRITE_HANDLER( magix_bankswitch_w )
  66. {
  67.     unsigned char *RAM = memory_region(REGION_CPU1);
  68.  
  69.     int bank = data & 7;
  70.     if (bank != data)    logerror("CPU #0 - PC %04X: Bank %02X\n",cpu_get_pc(),data);
  71.  
  72.     if (bank < 3)    RAM = &RAM[0x4000 * bank];
  73.     else            RAM = &RAM[0x4000 * (bank-3) + 0x10000];
  74.  
  75.     cpu_setbank(1, RAM);
  76. }
  77.  
  78. /*
  79.     Banked Video RAM:
  80.  
  81.     c000-c7ff    Palette    (bit 1 of port 0 switches between 2 banks)
  82.  
  83.     c800-cfff    Color    (bit 0 of port 0 switches between 2 banks)
  84.     d000-dfff    Tiles    ""
  85. */
  86.  
  87. static struct MemoryReadAddress magix_readmem[] =
  88. {
  89.     { 0x0000, 0x7fff, MRA_ROM                },    // ROM
  90.     { 0x8000, 0xbfff, MRA_BANK1                },    // Banked ROM
  91.     { 0xc000, 0xdfff, magix_videoram_r        },    // Video RAM (Banked)
  92.     { 0xe000, 0xffff, MRA_RAM                },    // RAM
  93.     { -1 }
  94. };
  95.  
  96. static struct MemoryWriteAddress magix_writemem[] =
  97. {
  98.     { 0x0000, 0x0000, MWA_ROM                },    // ROM
  99.     { 0x0001, 0x0001, magix_bankswitch_w    },    // ROM Bankswitching
  100.     { 0x0002, 0xbfff, MWA_ROM                },    // ROM
  101.     { 0xc000, 0xdfff, magix_videoram_w        },    // Video RAM (Banked)
  102.     { 0xe000, 0xffff, MWA_RAM                },    // RAM
  103.     { -1 }
  104. };
  105.  
  106.  
  107.  
  108.  
  109. static struct IOReadPort magix_readport[] =
  110. {
  111.     { 0x00, 0x00, input_port_0_r        },    // Coins
  112.     { 0x01, 0x01, input_port_1_r        },    // P1
  113.     { 0x02, 0x02, input_port_2_r        },    // P2
  114.     { 0x03, 0x03, input_port_3_r        },    // DSW 1
  115.     { 0x04, 0x04, input_port_4_r        },    // DSW 2
  116.     { -1 }
  117. };
  118.  
  119. static struct IOWritePort magix_writeport[] =
  120. {
  121.     { 0x00, 0x00, magix_videobank_w        },    // Video RAM Bank
  122.     { 0x01, 0x01, magix_bankswitch_w    },    // ROM Bankswitching (again?)
  123.     { 0x02, 0x02, soundlatch_w            },    // To Sound CPU
  124.     { 0x06, 0x06, magix_flipscreen_w    },    // Flip Screen
  125.     { 0x07, 0x07, IOWP_NOP                },    // ? (end of IRQ, random value)
  126.     { -1 }
  127. };
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134. /***************************************************************************
  135.  
  136.  
  137.                                 Sound CPU
  138.  
  139.  
  140. ***************************************************************************/
  141.  
  142.  
  143. /***************************************************************************
  144.                                     Magix
  145. ***************************************************************************/
  146.  
  147. static int adpcm;
  148.  
  149. WRITE_HANDLER( magix_sound_bankswitch_w )
  150. {
  151.     unsigned char *RAM = memory_region(REGION_CPU2);
  152.     int bank = data & 7;
  153.  
  154.     if ( bank != (data&(~0x20)) )     logerror("CPU #1 - PC %04X: Bank %02X\n",cpu_get_pc(),data);
  155.  
  156.     if (bank < 3)    RAM = &RAM[0x4000 * bank];
  157.     else            RAM = &RAM[0x4000 * (bank-3) + 0x10000];
  158.  
  159.     cpu_setbank(3, RAM);
  160.  
  161.     MSM5205_reset_w(0,data & 0x20);
  162. }
  163.  
  164. WRITE_HANDLER( magix_adpcm_w )
  165. {
  166.     /* Swap the nibbles */
  167.     adpcm = ((data&0xf)<<4) | ((data >>4)&0xf);
  168. }
  169.  
  170.  
  171.  
  172. static struct MemoryReadAddress magix_sound_readmem[] =
  173. {
  174.     { 0x0000, 0x7fff, MRA_ROM            },    // ROM
  175.     { 0x8000, 0xbfff, MRA_BANK3            },    // Banked ROM
  176.     { 0xf000, 0xf7ff, MRA_RAM            },    // RAM
  177.     { 0xf800, 0xf800, soundlatch_r        },    // From Main CPU
  178.     { -1 }
  179. };
  180.  
  181. static struct MemoryWriteAddress magix_sound_writemem[] =
  182. {
  183.     { 0x0000, 0x7fff, MWA_ROM                    },    // ROM
  184.     { 0x8000, 0xbfff, MWA_ROM                    },    // Banked ROM
  185.     { 0xe000, 0xe000, magix_sound_bankswitch_w    },    // ROM Bankswitching
  186.     { 0xe400, 0xe400, magix_adpcm_w                },
  187.     { 0xec00, 0xec00, YM3812_control_port_0_w    },    // YM3812
  188.     { 0xec01, 0xec01, YM3812_write_port_0_w        },
  189.     { 0xf000, 0xf7ff, MWA_RAM                    },    // RAM
  190.     { -1 }
  191. };
  192.  
  193. static struct IOReadPort magix_sound_readport[] =
  194. {
  195.     { -1 }
  196. };
  197. static struct IOWritePort magix_sound_writeport[] =
  198. {
  199.     { -1 }
  200. };
  201.  
  202.  
  203.  
  204.  
  205.  
  206. /***************************************************************************
  207.  
  208.  
  209.                                 Input Ports
  210.  
  211.  
  212. ***************************************************************************/
  213.  
  214. INPUT_PORTS_START( magix )
  215.  
  216.     PORT_START    // IN0 - Coins
  217.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  218.     PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_START2   )
  219.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  220.     PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_START1   )
  221.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  222.     PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_SERVICE1 )
  223.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  224.     PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_COIN1    )
  225.  
  226.     PORT_START    // IN1 - Player 1
  227.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  228.     PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  229.     PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_BUTTON2        | IPF_PLAYER1 )    // same as button1 !?
  230.     PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_BUTTON1        | IPF_PLAYER1 )
  231.     PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 )
  232.     PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_PLAYER1 )
  233.     PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_PLAYER1 )
  234.     PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_PLAYER1 )
  235.  
  236.     PORT_START    // IN2 - Player 2
  237.     PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  238.     PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_UNKNOWN  )
  239.     PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_BUTTON2        | IPF_PLAYER2 )    // same as button1 !?
  240.     PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_BUTTON1        | IPF_PLAYER2 )
  241.     PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 )
  242.     PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_PLAYER2 )
  243.     PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_PLAYER2 )
  244.     PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_PLAYER2 )
  245.  
  246.     PORT_START    // IN3 - DSW 1
  247.     PORT_SERVICE( 0x01, IP_ACTIVE_LOW )
  248.     PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) )
  249.     PORT_DIPSETTING(    0x00, "Easy" )
  250.     PORT_DIPSETTING(    0x06, "Normal" )
  251.     PORT_DIPSETTING(    0x04, "Hard" )
  252.     PORT_DIPSETTING(    0x02, "Hardest" )
  253.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  254.     PORT_DIPNAME( 0x08, 0x08, DEF_STR( Flip_Screen ) )
  255.     PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
  256.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  257.     PORT_DIPNAME( 0x10, 0x00, DEF_STR( Demo_Sounds ) )
  258.     PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
  259.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  260.     PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Coinage ) )
  261.     PORT_DIPSETTING(    0x00, DEF_STR( 4C_1C ) )
  262.     PORT_DIPSETTING(    0x20, DEF_STR( 3C_1C ) )
  263.     PORT_DIPSETTING(    0x60, DEF_STR( 2C_1C ) )
  264.     PORT_DIPSETTING(    0xe0, DEF_STR( 1C_1C ) )
  265.     PORT_DIPSETTING(    0x40, DEF_STR( 2C_3C ) )
  266.     PORT_DIPSETTING(    0xc0, DEF_STR( 1C_2C ) )
  267.     PORT_DIPSETTING(    0xa0, DEF_STR( 1C_3C ) )
  268.     PORT_DIPSETTING(    0x80, DEF_STR( 1C_4C ) )
  269.  
  270.     PORT_START    // IN4 - DSW 2
  271.     PORT_DIPNAME( 0x01, 0x01, "Title" )
  272.     PORT_DIPSETTING(    0x01, "Magix" )
  273.     PORT_DIPSETTING(    0x00, "Rock" )
  274.     PORT_DIPNAME( 0x02, 0x02, "Unknown 2-1" )    // the rest seems unused
  275.     PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
  276.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  277.     PORT_DIPNAME( 0x04, 0x04, "Unknown 2-2" )
  278.     PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
  279.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  280.     PORT_DIPNAME( 0x08, 0x08, "Unknown 2-3" )
  281.     PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
  282.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  283.     PORT_DIPNAME( 0x10, 0x10, "Unknown 2-4" )
  284.     PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
  285.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  286.     PORT_DIPNAME( 0x20, 0x20, "Unknown 2-5" )
  287.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  288.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  289.     PORT_DIPNAME( 0x40, 0x40, "Unknown 2-6" )
  290.     PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
  291.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  292.     PORT_DIPNAME( 0x80, 0x80, "Unknown 2-7" )
  293.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  294.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  295.  
  296. INPUT_PORTS_END
  297.  
  298.  
  299.  
  300.  
  301. /***************************************************************************
  302.  
  303.  
  304.                                 Graphics Layouts
  305.  
  306.  
  307. ***************************************************************************/
  308.  
  309. /* 8x8x4 tiles in 2 roms */
  310. static struct GfxLayout layout_8x8x4_split =
  311. {
  312.     8,8,
  313.     RGN_FRAC(1,2),
  314.     4,
  315.     {0,1,2,3},
  316.     {RGN_FRAC(1,2)+1*4,RGN_FRAC(1,2)+0*4,1*4,0*4, RGN_FRAC(1,2)+3*4,RGN_FRAC(1,2)+2*4,3*4,2*4},
  317.     {0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16},
  318.     4*8*4
  319. };
  320.  
  321.  
  322.  
  323. /*    Tiles in the background are 6x8 (!). They are 8 planes deep and are
  324.     oddily spread between 3 ROMs. We just stretch each tile to an 8x8 one */
  325.  
  326. static struct GfxLayout layout_6x8x8_stretch =
  327. {
  328.     8,8,
  329.     RGN_FRAC(1,3),
  330.     8,
  331.     {0,1,2,3,4,5,6,7},
  332.     {    RGN_FRAC(2,3) + 0*8, RGN_FRAC(1,3) + 0*8, RGN_FRAC(0,3) + 0*8,
  333.         RGN_FRAC(0,3) + 0*8,    /* Repeated pixel to pad to 8x8 */
  334.  
  335.         RGN_FRAC(2,3) + 1*8, RGN_FRAC(1,3) + 1*8, RGN_FRAC(0,3) + 1*8,
  336.         RGN_FRAC(0,3) + 1*8,    /* Repeated pixel to pad to 8x8 */
  337.     },
  338.     {0*32,0*32+2*8, 1*32,1*32+2*8, 2*32,2*32+2*8, 3*32,3*32+2*8},
  339.     4*4*8
  340. };
  341.  
  342.  
  343. /***************************************************************************
  344.                                     Magix
  345. ***************************************************************************/
  346.  
  347. static struct GfxDecodeInfo magix_gfxdecodeinfo[] =
  348. {
  349.     { REGION_GFX1, 0, &layout_6x8x8_stretch, 0, 0x08 }, // [0] Tiles (Background)
  350.     { REGION_GFX2, 0, &layout_8x8x4_split,     0,    0x40 }, // [1] Tiles (Text)
  351.     { -1 }
  352. };
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359. /***************************************************************************
  360.  
  361.  
  362.                                 Machine Drivers
  363.  
  364.  
  365. ***************************************************************************/
  366.  
  367.  
  368. /***************************************************************************
  369.                                     Magix
  370. ***************************************************************************/
  371.  
  372. static void magix_adpcm_int(int irq)
  373. {
  374.     static int toggle=0;
  375.  
  376.     MSM5205_data_w (0,adpcm>>4);
  377.     adpcm<<=4;
  378.  
  379.     toggle ^= 1;
  380.     if (toggle)
  381.         cpu_set_nmi_line(1,PULSE_LINE);
  382. }
  383.  
  384. static struct YM3812interface magix_ym3812_interface =
  385. {
  386.     1,
  387.     4000000,    /* ? */
  388.     { 50 },
  389.     { 0  },
  390. };
  391.  
  392. struct MSM5205interface magix_msm5205_interface =
  393. {
  394.     1,
  395.     384000,
  396.     { magix_adpcm_int },    /* interrupt function */
  397.     { MSM5205_S96_4B },        /* 4KHz, 4 Bits */
  398.     { 80 }
  399. };
  400.  
  401.  
  402. static struct MachineDriver machine_driver_magix =
  403. {
  404.     {
  405.         {
  406.             CPU_Z80,                    /* Z80B */
  407.             8000000,                    /* ? */
  408.             magix_readmem, magix_writemem,magix_readport,magix_writeport,
  409.             interrupt, 1    /* No nmi routine */
  410.         },
  411.         {
  412.             CPU_Z80 | CPU_AUDIO_CPU,    /* Z80A */
  413.             4000000,                    /* ? */
  414.             magix_sound_readmem, magix_sound_writemem,magix_sound_readport,magix_sound_writeport,
  415.             interrupt, 1    /* NMI caused by the MSM5205? */
  416.         }
  417.     },
  418.     60,DEFAULT_60HZ_VBLANK_DURATION,
  419.     1,
  420.     magix_init_machine,
  421.  
  422.     /* video hardware */
  423.     512, 256, { 0+64, 512-64-1, 0+8, 256-8-1 },
  424.     magix_gfxdecodeinfo,
  425.     0x800, 0x800,
  426.     0,
  427.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  428.     0,
  429.     magix_vh_start,
  430.     0,
  431.     magix_vh_screenrefresh,
  432.  
  433.     /* sound hardware */
  434.     0,0,0,0,
  435.     {
  436.         {
  437.             SOUND_YM3812,
  438.             &magix_ym3812_interface
  439.         },
  440.         {
  441.             SOUND_MSM5205,
  442.             &magix_msm5205_interface
  443.         }
  444.     }
  445. };
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452. /***************************************************************************
  453.  
  454.  
  455.                                 ROMs Loading
  456.  
  457.  
  458. ***************************************************************************/
  459.  
  460.  
  461.  
  462. /***************************************************************************
  463.  
  464.                                     Magix
  465.  
  466. ***************************************************************************/
  467.  
  468. ROM_START( magix )
  469.  
  470.     ROM_REGION( 0x24000+0x4000, REGION_CPU1 )        /* Main Z80 Code */
  471.     ROM_LOAD( "magix.07", 0x00000, 0x0c000, 0xd4d0b68b )
  472.     ROM_CONTINUE(         0x10000, 0x14000             )
  473.     /* $2000 bytes for bank 0 of video ram (text) */
  474.     /* $2000 bytes for bank 1 of video ram (background) */
  475.  
  476.     ROM_REGION( 0x24000, REGION_CPU2 )        /* Sound Z80 Code */
  477.     ROM_LOAD( "magix.08", 0x00000, 0x0c000, 0x6fd60be9 )
  478.     ROM_CONTINUE(         0x10000, 0x14000             )
  479.  
  480.     ROM_REGION( 0x180000, REGION_GFX1 | REGIONFLAG_DISPOSE )    /* Background */
  481.     ROM_LOAD( "magix.01",  0x000000, 0x80000, 0x4590d782 )
  482.     ROM_LOAD( "magix.02",  0x080000, 0x80000, 0x09efb8e5 )
  483.     ROM_LOAD( "magix.03",  0x100000, 0x80000, 0xc8cb0373 )
  484.  
  485.     ROM_REGION( 0x40000, REGION_GFX2 | REGIONFLAG_DISPOSE )    /* Text */
  486.     ROM_LOAD( "magix.05", 0x00000, 0x20000, 0x862d378c )    // only first $8000 bytes != 0
  487.     ROM_LOAD( "magix.06", 0x20000, 0x20000, 0x8b2ab901 )    // only first $8000 bytes != 0
  488.  
  489. ROM_END
  490.  
  491.  
  492. /***************************************************************************
  493.  
  494.  
  495.                                 Game Drivers
  496.  
  497.  
  498. ***************************************************************************/
  499.  
  500. // Title changes to "Rock" via DSW
  501. GAMEX( 1995, magix, 0, magix, magix, 0, ROT0_16BIT, "Yun Sung", "Magix", GAME_IMPERFECT_SOUND )
  502.